package com.tomorrowbbs.service.impl;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.List;

import com.tomorrowbbs.domain.dto.SysSettingDto;
import com.tomorrowbbs.domain.enums.SysSettingCodeEnum;
import com.tomorrowbbs.utils.JsonUtils;
import com.tomorrowbbs.utils.StringTools;
import com.tomorrowbbs.utils.SysCacheUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.tomorrowbbs.mapper.SysSettingMapper;
import com.tomorrowbbs.domain.SysSetting;
import com.tomorrowbbs.service.ISysSettingService;

/**
 * 系统设置信息Service业务层处理
 * 
 * @author zjz
 * @date 2024-11-09
 */
@Service
public class SysSettingServiceImpl implements ISysSettingService 
{
    private static final Logger logger = LoggerFactory.getLogger(SysSettingServiceImpl.class);
    @Autowired
    private SysSettingMapper sysSettingMapper;

    /**
     * 查询系统设置信息
     * 
     * @param code 系统设置信息主键
     * @return 系统设置信息
     */
    @Override
    public SysSetting selectSysSettingByCode(String code)
    {
        return sysSettingMapper.selectSysSettingByCode(code);
    }

    /**
     * 查询系统设置信息列表
     * 
     * @param sysSetting 系统设置信息
     * @return 系统设置信息
     */
    @Override
    public List<SysSetting> selectSysSettingList(SysSetting sysSetting)
    {
        return sysSettingMapper.selectSysSettingList(sysSetting);
    }

    /**
     * 新增系统设置信息
     * 
     * @param sysSetting 系统设置信息
     * @return 结果
     */
    @Override
    public int insertSysSetting(SysSetting sysSetting)
    {
        return sysSettingMapper.insertSysSetting(sysSetting);
    }

    /**
     * 修改系统设置信息
     * 
     * @param sysSetting 系统设置信息
     * @return 结果
     */
    @Override
    public int updateSysSetting(SysSetting sysSetting)
    {
        return sysSettingMapper.updateSysSetting(sysSetting);
    }

    /**
     * 批量删除系统设置信息
     * 
     * @param codes 需要删除的系统设置信息主键
     * @return 结果
     */
    @Override
    public int deleteSysSettingByCodes(String[] codes)
    {
        return sysSettingMapper.deleteSysSettingByCodes(codes);
    }

    /**
     * 删除系统设置信息信息
     * 
     * @param code 系统设置信息主键
     * @return 结果
     */
    @Override
    public int deleteSysSettingByCode(String code)
    {
        return sysSettingMapper.deleteSysSettingByCode(code);
    }

    @Override
    public void refreshCache() {
        try {
             // 创建系统设置DTO对象，用于存放所有系统设置信息
            SysSettingDto sysSettingDto = new SysSettingDto();
            // 从数据库中获取所有系统设置列表
            List<SysSetting> list = sysSettingMapper.selectSysSettingList(new SysSetting());
            // 遍历系统设置列表，将每个设置的详细信息填充到sysSettingDto中
            for(SysSetting sysSetting :list){
                // 获取当前系统设置的JSON内容
                String jsonContent = sysSetting.getJsonContent();
                // 如果JSON内容为空，则跳过当前系统设置
                if(StringTools.isEmpty(jsonContent)){
                    continue;
                }
                // 获取当前系统设置的代码
                String code = sysSetting.getCode();
                // 根据系统设置代码获取对应的枚举类型
                SysSettingCodeEnum sysSettingCodeEnum = SysSettingCodeEnum.getByCode(code);
                // 获取系统设置DTO中对应属性的PropertyDescriptor对象
                PropertyDescriptor pd = new PropertyDescriptor(sysSettingCodeEnum.getPropName(), sysSettingDto.getClass());
                // 获取设置属性值的方法
                Method method = pd.getWriteMethod();
                // 根据枚举类型中的类名获取类对象
                Class subClazz = Class.forName(sysSettingCodeEnum.getClazz());
                // 调用设置属性值的方法，将JSON内容转换为对象并设置到sysSettingDto中
                method.invoke(sysSettingDto, JsonUtils.convertJson2Obj(jsonContent,subClazz));
            }
            SysCacheUtils.refresh(sysSettingDto);

        }catch (Exception e){
            logger.error("刷新缓存失败",e);
        }
    }





}
